🧪 第4-5章 SQL代码实战练习

数据库创建与管理 + 数据表管理与数据操纵

共 20 题 由易到难 含知识点 + 提示 答案另附
A

基础篇——跟着写一遍(第1-8题)

1 创建数据库
第4章CREATE DATABASE
📚 考察知识点:CREATE DATABASE 语法、IF NOT EXISTS 安全写法、指定字符集和校对规则
请创建一个名为 school 的数据库,要求:
① 如果已存在则不报错
② 默认字符集为 utf8mb4
③ 默认校对规则为 utf8mb4_0900_ai_ci
💡 提示:用 IF NOT EXISTS 避免重复创建报错;字符集用 CHARACTER SET,校对规则用 COLLATE
2 查看和选择数据库
第4章SHOW / USE
📚 考察知识点:SHOW CREATE DATABASE 查看数据库信息、USE 切换当前数据库
请写出两条 SQL 语句:
① 查看刚创建的 school 数据库的详细信息(字符集、校对规则等)
② 切换到 school 数据库(后续操作都在这个库中进行)
💡 提示:查看用 SHOW CREATE DATABASE,切换用 USE
3 创建学生表
第5章CREATE TABLE约束
📚 考察知识点:CREATE TABLE 语法、数据类型选择(CHAR/VARCHAR/INT/ENUM)、NOT NULL、DEFAULT、PRIMARY KEY、COMMENT
在 school 数据库中创建学生表 student,字段要求如下:
字段名类型约束说明
snoCHAR(10)NOT NULL, PRIMARY KEY学号
snameVARCHAR(30)NOT NULL姓名
sexENUM('男','女')NOT NULL, DEFAULT '男'性别
ageINTNOT NULL年龄
majorVARCHAR(50)NOT NULL专业
deptVARCHAR(50)NOT NULL院系
💡 提示:用 COMMENT '说明' 给字段加注释;引擎用 InnoDB,字符集用 utf8mb4
4 创建课程表(带 CHECK 约束)
第5章CREATE TABLECHECK
📚 考察知识点:CHECK 约束、CONSTRAINT 命名约束、DECIMAL 类型
创建课程表 course,字段要求如下:
字段名类型约束说明
cnoCHAR(10)NOT NULL, PRIMARY KEY课程号
cnameVARCHAR(50)NOT NULL课程名
creditDECIMAL(3,1)CHECK: 0.5 ~ 8.0学分
💡 提示:给 CHECK 约束起名:CONSTRAINT chk_credit CHECK(credit >= 0.5 AND credit <= 8.0)
5 创建选课表(外键 + 联合主键)
第5章FOREIGN KEY联合主键
📚 考察知识点:FOREIGN KEY 外键约束、联合主键、CONSTRAINT 命名、引用关系
创建选课表 sc(学号 + 课程号组成联合主键),sno 引用 student 表,cno 引用 course 表,成绩 score 范围 0~100。
字段名类型约束
snoCHAR(10)NOT NULL, 外键→student(sno)
cnoCHAR(10)NOT NULL, 外键→course(cno)
scoreDECIMAL(5,2)CHECK: 0~100
💡 提示:联合主键:PRIMARY KEY (sno, cno);外键:CONSTRAINT fk_sc_sno FOREIGN KEY (sno) REFERENCES student(sno)
6 插入数据——搬入"第一批住户"
第5章INSERT
📚 考察知识点:INSERT INTO 单行 / 多行插入、字符型数据用单引号、遵守约束
请完成以下三步插入操作:
① 向 student 表中一次性插入以下 3 个学生:
('s1','张三','男',20,'计算机','信息学院')('s2','李四','女',21,'软件工程','信息学院')('s3','王五','男',19,'数据科学','信息学院')

② 向 course 表中插入 2 门课程:
('c1','数据库原理',3.5)('c2','数据结构',4.0)

③ 向 sc 表中插入 3 条选课记录:
('s1','c1',85)('s1','c2',92)('s2','c1',78)
💡 提示:多行插入用 VALUES (...), (...), (...);,注意先插 student 和 course,再插 sc(外键约束)
7 查看表结构
第5章DESC / SHOW
📚 考察知识点:SHOW TABLES、DESC 查看字段信息、SHOW CREATE TABLE 查看建表语句
请写出三条语句:
① 查看 school 数据库中有哪些表
② 查看 student 表的字段信息
③ 查看 sc 表的完整建表语句(包含外键约束名等信息)
💡 提示:三条分别对应 SHOW TABLES / DESC / SHOW CREATE TABLE
8 UPDATE 和 DELETE 基础操作
第5章UPDATEDELETE
📚 考察知识点:UPDATE SET WHERE 修改数据、DELETE FROM WHERE 删除数据
请完成以下操作:
① 把张三的专业改为 人工智能
② 所有学生的年龄增加 1 岁
③ 删除 s2 在 c1 课程上的选课记录
💡 提示:①和③需要 WHERE 精确定位;②不加 WHERE 表示修改所有行
B

进阶篇——灵活运用(第9-14题)

9 ALTER TABLE 六连击
ALTER TABLE6种操作
📚 考察知识点:ADD 加字段、RENAME 改表名、CHANGE 改字段名、MODIFY 改类型/顺序、ENGINE 换引擎、DROP 删字段
对 student 表依次执行以下 6 个操作(每个操作写一条语句):
① 添加字段 phone VARCHAR(20),放在 sname 后面
② 把字段 major 改名为 maj(类型不变 VARCHAR(50))
③ 把 phone 的类型从 VARCHAR(20) 改为 CHAR(11)
④ 查看修改后的 student 表结构(验证你的修改)
⑤ 删除刚才添加的 phone 字段
⑥ 把字段 maj 改回 major(恢复原状)
💡 提示:① ADD ... AFTER、② CHANGE、③ MODIFY、④ DESC、⑤ DROP、⑥ CHANGE
10 约束的查看与删除
约束管理SHOW CREATE TABLE
📚 考察知识点:用 SHOW CREATE TABLE 查看约束名、DROP CONSTRAINT 删除约束、DROP FOREIGN KEY 删除外键
请完成以下操作:
① 查看 sc 表的完整建表语句,找到 CHECK 约束的名字
② 删除 sc 表上的 CHECK 约束(用你查到的名字)
③ 重新添加一个 CHECK 约束,要求 score 范围是 0~150(考虑加分),并命名为 chk_score_new
💡 提示:删除用 ALTER TABLE sc DROP CONSTRAINT 约束名;;添加用 ALTER TABLE sc ADD CONSTRAINT chk_score_new CHECK(...);
11 INSERT 的多种姿势
INSERTREPLACE
📚 考察知识点:完整插入 vs 部分插入、NULL 值处理、INSERT 和 REPLACE 的区别
① 向 sc 表中插入一条记录:s3 选了 c1,但还没考试(成绩未知)
② 用 SELECT * FROM sc; 查看此时 s3 的 score 是什么值
③ 现在 s3 考完了,用 REPLACE 语句把 s3+c1 的成绩更新为 88 分
💡 提示:①只给 sno 和 cno 赋值,score 会自动为 NULL;③ REPLACE 遇到主键重复时会先删旧记录再插新记录
12 外键的"拦路虎"效果
FOREIGN KEY错误体验
📚 考察知识点:外键如何阻止非法插入和非法删除、正确的删除顺序
请依次执行以下操作,观察哪些会成功、哪些会报错
① 尝试在 sc 中插入 ('s99','c1',60)——一个不存在的学号
② 尝试直接删除 student 表中的张三(s1)——他在 sc 中有选课记录
③ 用正确的顺序删除张三:先删 sc 中 s1 的记录,再删 student 中 s1 的记录
💡 提示:①和②都会因为外键约束而报错(ERROR 1452 / ERROR 1451)。③分两步走即可成功。写下这3组语句,执行时注意观察报错信息。
13 修改数据库参数
第4章ALTER DATABASE
📚 考察知识点:ALTER DATABASE 修改字符集和校对规则、SHOW CREATE DATABASE 验证
① 把 school 数据库的字符集改为 utf8,校对规则改为 utf8_general_ci
② 查看修改后的效果
③ 再改回 utf8mb4utf8mb4_0900_ai_ci
💡 提示:ALTER DATABASE school DEFAULT CHARACTER SET ... DEFAULT COLLATE ...;
14 安全删表的正确顺序
DROP TABLE外键顺序
📚 考察知识点:DROP TABLE IF EXISTS、有外键时的删除顺序(先从表后主表)
现在要删除 school 数据库中的所有表。请注意:sc 表通过外键引用了 student 和 course 表。

请写出正确的删除顺序(3条 DROP TABLE 语句),并说明为什么要这个顺序。
💡 提示:被引用的表(主表)不能先删,必须先删引用别人的表(从表)。在 SQL 注释中写下你的理由!
C

综合篇——串联所有命令(第15-18题)

15 🏫 完整流程:从零搭建一个图书馆系统
综合全流程
📚 考察知识点:CREATE DATABASE → CREATE TABLE(含约束)→ INSERT → SELECT → UPDATE → DELETE,串联第4-5章全部核心命令
📖 场景:学校图书馆需要一个简易管理系统,包含"读者表"和"图书表"和"借阅表"。请从创建数据库开始,完成整个搭建过程。
请按顺序完成以下全部步骤:

Step 1:创建数据库 library(utf8mb4,如果已存在不报错)
Step 2:切换到 library 数据库
Step 3:创建读者表 reader:reader_id CHAR(6) 主键、name VARCHAR(20) NOT NULL、phone VARCHAR(20)
Step 4:创建图书表 book:book_id CHAR(10) 主键、title VARCHAR(100) NOT NULL、author VARCHAR(50)、price DECIMAL(6,2)
Step 5:创建借阅表 borrow:reader_id + book_id 联合主键、borrow_date DATE NOT NULL,reader_id 外键→reader,book_id 外键→book
Step 6:插入 2 个读者、3 本书、2 条借阅记录
Step 7:查看所有表的列表
Step 8:把某本书的价格改为 59.90 元
Step 9:删除一条借阅记录
💡 提示:一步一步来,每完成一步可以用 SELECT * FROM 表名 验证。日期用 '2025-03-15' 格式。
16 🔧 表结构大改造
综合ALTER TABLE
📚 考察知识点:ALTER TABLE 的 ADD/CHANGE/MODIFY/DROP 综合运用、SHOW CREATE TABLE 验证
📖 场景:leader 说图书表 book 需要改造:加一个"出版社"字段、把"author"改名为更清晰的名字、改一下价格的精度、最后验证改造结果。
对 library 数据库的 book 表,依次完成以下操作:
① 添加字段 publisher VARCHAR(50),放在 author 后面
② 把字段 author 改名为 writer(VARCHAR(50) 不变)
③ 把 price 的类型从 DECIMAL(6,2) 改为 DECIMAL(8,2)(支持更高价格)
④ 查看 book 表的完整建表语句,确认所有修改生效
⑤ 删除 publisher 字段(leaer 又说不需要了……)
💡 提示:① ADD AFTER、② CHANGE、③ MODIFY、④ SHOW CREATE TABLE、⑤ DROP
17 💾 数据的增删改全流程
综合INSERT/UPDATE/DELETE
📚 考察知识点:INSERT 多行 / 部分插入、UPDATE 带条件 / 不带条件、DELETE 带条件 / 清空、外键约束的影响
📖 场景:新学期开始,school 数据库的 student/course/sc 表需要做一批数据维护。(注意:如果前面做了删除操作,请先重新插入数据)
请依次完成以下操作(可以在每步之后用 SELECT * 验证):
① 向 student 中新增两个学生:('s4','赵六','女',20,'人工智能','信息学院')('s5','钱七','男',22,'网络安全','信息学院')
② 向 course 中新增一门课:('c3','Python编程',3.0)
③ s4 和 s5 都选了 c3,但还没考试(只插入学号和课程号)
④ 期末结束,s4 的 c3 成绩为 95 分——用 UPDATE 填入成绩
⑤ 所有课程的学分统一增加 0.5
⑥ s5 退选了 c3——删除这条选课记录
💡 提示:③只给 sno, cno 赋值;④用 WHERE sno='s4' AND cno='c3';⑤不加 WHERE
18 🧹 清理大扫除
综合DROP
📚 考察知识点:DROP TABLE 的正确顺序(外键依赖)、DROP DATABASE 删除数据库、IF EXISTS 安全写法
请依次完成以下清理操作:
① 按正确顺序删除 library 数据库中的所有表(borrow、book、reader)
② 删除 library 数据库本身
③ 用 SHOW DATABASES; 确认 library 已不存在
💡 提示:先删从表(borrow),再删主表(book、reader)。全部用 IF EXISTS 保证安全。
D

趣味挑战——找错纠错(第19-20题)

19 🐛 Bug Hunter:找出 5 个错误
趣味找错
📚 考察知识点:SQL 语法细节——引号、分号、关键字拼写、约束规则、数据类型匹配等
以下建表语句有 5 处错误,请找出所有错误并写出修正后的完整语句
CREAT TABLE employee ( eid INT PRIMARY KEY ename VARCHAR(50) NOT NULL, salary DECIMAL(8,2) CHECK(salary > 0), dept_id CHAR(10), FOREIGN KEY (dept_id) REFERENCE department(dept_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
💡 提示:仔细看每一行——关键字拼写对不对?标点符号齐不齐?结尾有没有缺东西?
20 🎯 命令连连看:读需求写 SQL
趣味综合
📚 考察知识点:根据自然语言需求快速选择正确的 SQL 命令(考查第4-5章全部命令的辨析能力)
请根据以下每条需求,写出一条对应的 SQL 语句(假设 school 数据库和 student/course/sc 表都存在):

① 老板说:"查一下咱们数据库用的什么字符集"
② 老板说:"给 student 表加一列'邮箱' email,VARCHAR(60)"
③ 老板说:"s2 同学转专业了,改成'网络安全'"
④ 老板说:"c2 这门课不开了,但有人选了,你看着办"
⑤ 老板说:"看看 student 表是怎么建的,我要复制一份到新系统"
⑥ 老板说:"student 表有个存储引擎要查一下"
💡 提示:④需要考虑外键——先删 sc 中选了 c2 的记录,再删 course 中的 c2。⑥用 SHOW CREATE TABLE 就能看到 ENGINE 信息。